package logica_de_negocio;

import java.util.HashSet;

import comun.Capitulo;
import logica_de_datos.GestorBD;

public class gestorCapitulo {

	protected HashSet<Capitulo> lc;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorCapitulo() {

		lc = new HashSet<Capitulo>();
	}

	/**
	 * Recuepera los datos almacenados en la base de datos y los introduce en un
	 * HashSet
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public void cargarDatos() throws ClassNotFoundException {
		
			objConversor.connect();
			lc = objConversor.listarCapitulo();
			objConversor.disconnect();
		
	}

	// TITULO->de la serie
	// NOMBRE-> del capitulo
	/**
	 * Anadir un capitulo a la base de datos y avisa a los usuarios que los tiene
	 * disponible anadiendolo a su lista.
	 * 
	 * @param cap
	 *            ->Capitulo(Obj) que se desea almacenar en la base de datos.
	 * @throws excepAnadirDupli
	 *             Si el capitulo a introducir ya esta en la base de datos
	 * @throws FaltanDatosEnLaBaseDeDatos
	 *             Cuando la serie a la que se quiere unir el capitulo no esta
	 *             ya disponible
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public boolean anadirC(Capitulo cap) throws excepAnadirDupli,// OK
			FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {
		cargarDatos();
		if (lc.contains(cap)) {
			excepAnadirDupli dupli = new excepAnadirDupli();
			dupli.setDes("El capitulo con  titulo " + cap.getNombre()
					+ "  ya esta en la base de datos");
			throw dupli;
		} else {
			comprovarCap(cap);
			comprovarNCapNTemP(cap);
			
				objConversor.connect();
				objConversor.addCapitulo(cap);
				objConversor.disconnect();
			
		}
		cargarDatos();
		boolean con = false;
		Capitulo c = getCapitulo(cap.getId_s(), cap.getNombre(),
				cap.getNum_cap());
		if (c.equals(cap)) {
			con = true;
			GestorSigueSerie gss = new GestorSigueSerie();
			gss.avisar(cap.getId_s(), c.getId_c());
		}
		return con;
	}

	private void comprovarNCapNTemP(Capitulo cap) throws excepAnadirDupli {

		for (Capitulo c : lc) {
			if (c.getId_s() == cap.getId_s()) {
				if (c.getNum_temp() == cap.getNum_temp()) {
					if (c.getNum_cap() == cap.getNum_cap()) {
						excepAnadirDupli dupli = new excepAnadirDupli();
						dupli.setDes("El capitulo con titulo "
								+ cap.getNombre() + " con temporada "
								+ cap.getNum_temp() + " y numero de capitulo "
								+ cap.getNum_cap() + " de la serie con id-->"
								+ cap.getId_s() + " ya existe");
						throw dupli;
					}
				}
			}
		}

	}

	private void comprovarCap(Capitulo cap) throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {// OK

		/**
		 * Comprueba que el id de la serie este en la base de datos
		 */

		gestorSerie gs = new gestorSerie();
		if (gs.isId(cap.getId_s())) {

		} else {
			FaltanDatosEnLaBaseDeDatos ex = new FaltanDatosEnLaBaseDeDatos();
			ex.setFalta("Falta el id de la serie en la base de datos");
			throw ex;
		}
	}

	public boolean borrar(int id_c, ExcepDeleteOnCascade e)
			throws ExcepDeleteOnCascade, ClassNotFoundException {// OK

		boolean rea = false;

		gestorCapituloVistaNoSi gcvns = new gestorCapituloVistaNoSi();
		gestorValoracionCapitulo gvc = new gestorValoracionCapitulo();
		boolean permitido = e.isAceptado();
		if (permitido == false) {
			if ((gcvns.isId_c(id_c)) || (gvc.isId_c(id_c))) {

				throw e;

			} else {
				permitido = true;
			}
		}
		if (permitido == true) {
			boolean relCVNS = false;

			if (gcvns.isId_c(id_c)) {
				relCVNS = gcvns.deleteAllCapituloVistaNoSiFromId_C(id_c);
			} else {
				relCVNS = true;
			}

			boolean relVC = false;

			if (gvc.isId_c(id_c)) {
				relVC = gvc.deleteAllValoracionCapituloFromId_C(id_c);
			} else {
				relVC = true;
			}

			boolean bCap = borrarfin(id_c);

			if (bCap == true) {
				if (relVC == true) {
					if (relCVNS == true) {
						rea = true;
					}
				}
			}
		}
		return rea;

	}

	public boolean borrarfin(int id_c) throws ClassNotFoundException {
		boolean rea = false;
		
			objConversor.connect();
			objConversor.deleteCapitulo(id_c);
			rea = true;
			objConversor.disconnect();
		
		return rea;
	}

	public Capitulo getCapitulo(int id) throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {// OK

		cargarDatos();
		Capitulo dev = null;
		for (Capitulo c : lc) {
			if (c.getId_c() == id) {
				dev = c;
			}
		}
		if (dev == null) {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("No se encuentra el capitulo en la base de datos");
			throw f;
		}
		return dev;
	}

	public Capitulo getCapitulo(int id_s, String nombre, int num_cap)// OK
			throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {

		cargarDatos();
		Capitulo dev = null;
		for (Capitulo c : lc) {
			if (c.getId_s() == id_s) {
				if (c.getNombre().equals(nombre)) {
					if (c.getNum_cap() == num_cap) {
						dev = c;
					}
				}
			}
		}
		if (dev == null) {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("No se encuentra el capitulo en la base de datos");
			throw f;
		}
		return dev;
	}

	public boolean contiene(Capitulo obj) throws ClassNotFoundException {// OK--Se usa?
		cargarDatos();
		boolean con = false;
		for (Capitulo cap : lc) {
			if (cap.getId_c() == obj.getId_c()) {
				con = true;
			}
		}
		return con;
	}

	public boolean modifyCapitulo(Capitulo obj)// OK
			throws FaltanDatosEnLaBaseDeDatos, ExcepDatosNoAdmitidos, ClassNotFoundException {

		cargarDatos();
		boolean dev = false;
		if (isId(obj.getId_c())) {
			// DEBE MANTENERSE QUE LA UNION ID_S, NOMBRE y NUM_CAP SEA UNICA
			if (regla(obj)) {
				
					objConversor.connect();
					objConversor.modifyCapitulo(obj);
					dev = true;
					objConversor.disconnect();
				
			} else {
				throw new ExcepDatosNoAdmitidos();
			}
		} else {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("No existe un capitulo con el id-" + obj.getId_c());
			throw f;
		}
		return dev;
	}

	private boolean regla(Capitulo obj) throws FaltanDatosEnLaBaseDeDatos, ClassNotFoundException {// OK
		boolean dev = true;
		Capitulo cap = getCapitulo(obj.getId_c());// LOS CON EL MISMO ID
		if (obj.equals(cap)) {// UNICAMENTE SE MODIFICAN ASPECTOS NO IMPORTANTES
			dev = true;
		} else {// REVISAR SI HAY ALGUN CAPITULO QUE YA TENGA ESAS
				// CARCATERISTCAS PERO CON OTRO ID
			gestorSerie gs = new gestorSerie();
			if (gs.isId(obj.getId_s())) {
				for (Capitulo c : lc) {
					if (c.getId_s() == obj.getId_s()) {
						if (c.getNombre().equals(obj.getNombre())) {
							if (c.getNum_cap().equals(obj.getNum_cap())) {
								if (c.getId_c() != obj.getId_c()) {
									dev = false;// YA EXISTE UNO
								}
							}
						}
					}
				}
			} else {
				FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
				f.setFalta("No hay una seria en la base de datos con el id-"
						+ obj.getId_s());
				throw f;
			}
		}
		return dev;
	}

	public boolean estaVacia() throws ClassNotFoundException {// OK
		cargarDatos();
		return lc.isEmpty();
	}
	/**
	 * Borra todas las capitulos y comprueba que sea asi
	 * 
	 * @return True si se ha borrado todas los capitulos con existo
	 * @throws ClassNotFoundException Error que se lanza cuando no existe la base de datos.
	 */
	public boolean reset() throws ClassNotFoundException {// OK
		cargarDatos();
		ExcepDeleteOnCascade e = new ExcepDeleteOnCascade();
		e.setAceptado(true);
		for (Capitulo c : lc) {
			try {
				borrar(c.getId_c(), e);
			} catch (ExcepDeleteOnCascade e1) {
			}
		}
		cargarDatos();
		boolean dev = false;
		if (lc.isEmpty()) {
			dev = true;
		}
		return dev;
	}

	public HashSet<Capitulo> getCapitulos() throws ClassNotFoundException {// OK
		cargarDatos();
		return lc;
	}

	public HashSet<Capitulo> getCapitulosId_s(int id_s) throws ClassNotFoundException {// OK
		cargarDatosSoloId_s(id_s);
		return lc;
	}

	private void cargarDatosSoloId_s(int id_s) throws ClassNotFoundException {

		
			objConversor.connect();
			lc = objConversor.listarCapituloSoloId_s(id_s);
			objConversor.disconnect();
		
	}

	public boolean isId(int id_c) throws ClassNotFoundException {// OK
		boolean esta = false;
		HashSet<Integer> ids;
			objConversor.connect();
			ids = objConversor.listarCapitulosSoloId();
			objConversor.disconnect();
		
		for (Integer inte : ids) {
			if (inte.intValue() == id_c) {
				esta = true;
			}
		}
		return esta;
	}

	public boolean isId_s(int id_s) throws ClassNotFoundException {

		boolean dev = false;

		cargarDatos();

		for (Capitulo c : lc) {
			if (c.getId_s() == id_s) {
				dev = true;
			}
		}

		return dev;
	}

	public HashSet<Capitulo> getCapitulos(HashSet<Integer> id_Val) throws ClassNotFoundException {
		HashSet<Capitulo> cap = new HashSet<Capitulo>();
		cargarDatos();
		for (Capitulo c : lc) {
			for (Integer i : id_Val) {
				if (c.getId_c() == i) {
					cap.add(c);
				}
			}
		}
		return cap;
	}
}